home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mem / sun3.md / memPC.s < prev   
Text File  |  1992-12-18  |  3KB  |  108 lines

  1. /* 
  2.  * memPC.s --
  3.  *
  4.  *     Procedures for obtain the PC of the caller of a routine.
  5.  *
  6.  *  $Header: /cdrom/src/kernel/Cvsroot/kernel/mem/sun3.md/memPC.s,v 1.4 91/10/30 12:57:27 mgbaker Exp $ SPRITE (Berkeley)
  7.  *
  8.  * Copyright 1987 Regents of the University of California
  9.  * All rights reserved.
  10.  */
  11.  
  12.  
  13. #if    defined(VAX) || defined(vax) || defined(uvax)
  14.  
  15. /*
  16.  * The stack layout on a VAX when Mem_CallerPC is called. The calls instruction
  17.  * on the VAX updates the frame pointer, so we have to go back two levels
  18.  * on the stack to get the PC of the call to Mem_Alloc/Free.
  19.  *
  20.  *   Foo calls Mem_Alloc (or Mem_Free):
  21.  *
  22.  * Top of the stack (it grows down from here)
  23.  *    +----------------------------+
  24.  *    | ... (Foo's frame)          |
  25.  *    |----------------------------|
  26.  *    | Arg. to Mem_Alloc          |
  27.  *    |----------------------------|
  28.  *    | # of args to Mem_Alloc     |
  29.  *    |----------------------------|
  30.  * 16 | PC of "calls Mem_Alloc"    |    2) left in r0
  31.  *    |----------------------------|
  32.  * 12 | Foo's FP                   |
  33.  *    |----------------------------|
  34.  *  8 | Foo's AP                   |
  35.  *    |----------------------------|
  36.  *  4 | mask/PSW                   |
  37.  *    |----------------------------|
  38.  *  0 | condition handler          | :Mem_Alloc's FP
  39.  *    |----------------------------|
  40.  *    | local variables            |
  41.  *    |----------------------------|
  42.  * 16 | PC of "calls Mem_CallerPC" |
  43.  *    |----------------------------|
  44.  * 12 | Mem_Alloc's FP             |    1) copy to r0
  45.  *    |----------------------------|
  46.  *  8 | Mem_Alloc's AP             |
  47.  *    |----------------------------|
  48.  *  4 | mask/PSW                   |
  49.  *    |----------------------------|
  50.  *  0 | condition handler          | :Mem_CallerPC's FP
  51.  *    +----------------------------+
  52.  */
  53.  
  54.     .globl    _Mem_CallerPC
  55. _Mem_CallerPC:
  56.     .word 0
  57.     movl    12(fp),r0    /* 1) r0 = fp of caller */
  58.     movl    16(r0),r0    /* 2) r0 = pc with fp */
  59.     ret
  60.  
  61. #endif    defined(VAX) || defined(vax) || defined(uvax)
  62.  
  63.  
  64. #if    defined(mc68000) || defined(sun2) || defined(sun3)
  65. /*
  66.  * The stack layout on a MC680?? when Mem_CallerPC is called. The routine 
  67.  * doesn't use a link instruction so it is still using Mem_Alloc/Free's 
  68.  * frame pointer (reg. a6).
  69.  *
  70.  *   Foo calls Mem_Alloc (or Mem_Free):
  71.  *
  72.  * Top of the stack (it grows down from here)
  73.  *   +----------------------------+
  74.  *   | ....                       |
  75.  *   |----------------------------|
  76.  *   | Saved Foo's caller FP      |
  77.  *   |----------------------------|
  78.  *   | Saved registers, local var |
  79.  *   |----------------------------|
  80.  * 4 | PC of "jsr Mem_Alloc"      |
  81.  *   |----------------------------|
  82.  * 0 | Saved Foo's FP             | :A6 (Mem_Alloc's FP)
  83.  *   |----------------------------|
  84.  *   | Saved registers, local var |
  85.  *   |----------------------------|
  86.  *   | PC of "jsr Mem_CallerPC"   |
  87.  *   |----------------------------|
  88.  *   | ....                       | :SP
  89.  *   +----------------------------+
  90.  */
  91.  
  92.     .globl    _Mem_CallerPC
  93. _Mem_CallerPC:
  94.     movl    a6@(4),d0    /* PC of the caller of Mem_Alloc. */
  95.     rts
  96.  
  97. #endif    defined(mc68000) || defined(SUN2) || defined(SUN3)
  98.  
  99. #ifdef sun4
  100. #include "machConst.h"
  101. .globl    _Mem_CallerPC
  102. _Mem_CallerPC:
  103.     /* the pc of the caller of the routine that called us is in i7. */
  104.     mov    %RETURN_ADDR_REG_CHILD, %RETURN_VAL_REG
  105.     retl    /* return from leaf routine */
  106.     nop
  107. #endif /* sun4 */
  108.